# 什么是部署
软件部署(英语:Software deployment)是为将一个软件系统投入使用而进行的所有活动,[1]包括硬件配置、软件的安装、环境变量设置等。在一些机器上批量安装某一程序也称为软件部署,分为指派与发布两种类型。 ——《维基百科》
“从功能开发完成直到成功部署”这一阶段被称为软件开发“最后一公里”。部署(Deploy)指的是将构建后的新版本应用或者服务安装到目标环境(开发、测试或者生成)中。发布指的是将新版本的应用或者服务最终交给用户使用。
在前端项目中,部署相对简单,一般指的是将构建好的静态资源文件放在服务器上。那么接下来我们看下在我们平时开发过程中,传统的手动部署方案和自动化部署方案的流程以及其对比。
# 手动部署
手动部署,顾名思义,就是我们手动将构建后的产物上传至目标服务器。其流程大致如下:

- 源码构建:在项目中执行构建命令,一般为
npm run build,在发布前的构建环节,我们一般会获取生成环境的配置信息然后进行编译\构建过程(代码效验、代码压缩、自动化测试等操作),最终生成可上线的构建产物。 - 连接服务器:使用 FTP 或者 SSH 工具连接服务器。
- 上传资源:将构建后的产物上传至 web 目录。
手动部署的优点和缺点都是显而易见的。优点就是简单、门槛低,我们可以直接将构建产物拖动上传到服务器就完成了部署和发布的过程。但是手动部署从名字上就可以感觉到一点都不“程序员” ヾ(=・ω・=)o,人效低并且安全风险高。
# 自动化部署
为了解决手动部署人效低且风险高的问题,我们可以将部署流程自动化,自动化部署流程如下:

- 获取代码:首先我们需要从远程仓库拉取最新的代码。在获取完代码之后我们还可以进行对代码的安全检查和单元测试的操作。
- 安装依赖:然后需要安装项目构建时所需要的依赖包为后面构建环节做准备。
- 构建源码:在获取完依赖之后,我们就需要对源码就行构建操作,生成构建产物。在构建完成之后,我们可以对构建后的产物进行检查,比如资源文件是不是过大等。
- 上传资源:在源码构建完毕之后我们就可以将构建产物上传至服务器或者 CDN。
- 通过构建完成:最后,最好有触达通知我们构建完成,本次自动化部署才算真正完成。
# 手动部署和自动化部署对比
在了解了手动部署好自动化部署之后,我们来对比下两者的优缺点。
# 手动部署优点
虽然我们不提倡手动部署,但是凡事都会有正反两面,对吧 (●゚ω゚●)。手动部署的优点,在我来看就是门槛低、单一次部署来看,会更方便一些。
在我自己刚开始搭建自己网站的时候,为了更快的看到效果,就直接在自己本地开发完之后,本地执行构建,拿到构建好的静态资源之后直接丢到服务器上,在线上就可以立即看到修改的内容。当然,这样的便捷只是一时的,如果花时间将自动化部署搭建好,那么每次开发完就只需要几个命令点一点就可以完成部署任务。
单一次部署来看,手动部署会节省部署时间,因为手动部署因为是在本地操作,所以不需要再从远程仓库获取代码,并且我们在开发的时候已经安装过依赖了,也不需要重复进行依赖的安装,这使得手动部署在流程上比自动化部署要少两个环节。同时,手动部署在构建完成之后可以直观的看到构建产物,会方便调试和问题的排查。
# 手动部署的缺点
手动部署的缺点主要有以下几点:
# 流程规范和稳定性差
首先是流程规范性,手动部署全靠人工手动操作,人工操作在整个过程可能中很难保证每次的流程顺序和处理过程都一致,并且无日志追踪,出现问题不容易及时发现和复盘。
同时,本地部署依赖于开发者的本地环境,在团队开发中,不同团队成员的本地环境可能是不一样的(包括但不限于 nodeJS 版本、操作系统),不同环境的构建产物可能不同。所以手动部署会降低项目的稳定性和增加项目的风险。
# 可回溯性差
手动部署通常只会在本地保留一次最新的构建产物,那么在线上代码出问题的时候,不能方便及时的做到代码回滚。同时,手动部署缺乏部署日志,在团队之间,不能方便查看发布记录。并且在项目部署过程中遇到的问题不方便共享查看解决,比如构建失败日志、单测执行失败等。
# 自动化部署优点
自动化部署就可以解决可手动部署的缺点。自动化部署有完善的流程规范,降低手动操作出错的可能性。同时,可以保证构建和部署环境的一致性,避免不同环境产生的影响。同时自动化部署有详细的日志记录模块,出错可追踪,更好的方便后期的排查和复盘。最后,自动化部署会保留多次构建产物,方便及时回滚。
# CI/CD 持续集成和持续交付
CI 指持续集成(Continuous Integration),CD 指持续交付(Continuous Delivery)和 持续部署(Continuous Deployment),是一种软件开发实践。意思是通过一系列自动化的脚本执行,实现开发过程中的代码的交付和部署,能够快速交付,提高团队开发的效率。
持续集成指的是频繁的将代码集成到主干环境,在保证高质量的同时,可以让产品快速迭代。持续交付是在持续集成之后,将软件的新版本交付给 QA 或者用户。在通过交付指标之后,自动部署到生产环境。
CI/CD 即可以仅指持续集成、持续交付构成的关联环节,也可以指持续集成、持续交付、持续部署构成的关联环节。在我们平时的开发中,这些概念都是表示是在代码开发完成后的自动化处理流程。
